const express = require("express");
const multer = require('multer');
const path = require('path')
const JWT = require('../util/token.js');

let router = express.Router();
const uploadFolder = "/uploads"
let destinationFilePath =  path.join(__dirname,'../public' + uploadFolder)

//Multer是Express官方推出的，用于Node.js multipart/form-data请求数据处理的中间件。
//它基于busboy构建，可以高效的处理文件上传，但并不处理multipart/form-data之外的用户请求。
//Multer在解析完请求体后，会向Request对象中添加一个body对象和一个file或files对象（上传多个文件时使用files对象 ）。
//其中body对象中包含所提交表单中的文本字段（如果有），而file(或files)对象中包含通过表单上传的文件。

//配置diskStorage来控制文件存储的位置以及文件名字等
var storage = multer.diskStorage({
    //确定图片存储的位置
    destination(req, file, callback){
			let filePath = destinationFilePath;			
      callback(null, filePath)
    },    
    //确定图片存储时的名字,注意，如果使用原名，可能会造成再次上传同一张图片的时候的冲突
    filename(req, file, callback){			
			// 将保存文件名设置为 字段名 + 时间戳 + 后缀名
			let fields = (file.originalname).split('.');
			let filename = fields[0] + '-' + Date.now() + '.' + fields[fields.length - 1]
      callback(null, filename )   
    }
});
//生成的专门处理上传的一个工具，可以传入storage、limits等配置
var upload = multer({storage: storage});
 
//单个文件上传  
router.post('/single',upload.single('singleFile'),  (req, res) => {
    //图片已经被放入到服务器里,且req也已经被upload中间件给处理好了（加上file等信息）
    if(!req.file){
        return res.send({
            code: -1,
            msg:"检查上传文件提交的数据是否正确",
						data:null,
        });
    }
		let url =  uploadFolder + '/'
		
    url += req.file.filename;
		let fullUrl = `${req.protocol}://${req.headers.host}${url}`;
		//http://localhost:5050 + url
		res.send({
        code: 1,
				msg: "上传成功！",
				type: 'single',
				originalname: req.file.originalname,
				path: req.file.path,
				url: url,
				fullUrl: fullUrl,
    })
});

//单个文件上传（仅上传头像）  
router.post('/avatar',upload.single('avatar'),  (req, res) => {
    //图片已经被放入到服务器里,且req也已经被upload中间件给处理好了（加上了file等信息）
    //线上的也就是服务器中的图片的绝对地址
    if(!req.file){
        return res.send({
            code: -1,
            msg:"检查上传文件提交的数据是否正确",
        });
    }
    var url = '/uploads/' + req.file.filename
    res.send({
        code: 1,
        type: 'avatar',
        originalname: req.file.originalname,
        path: req.file.path,
        url: url 
    })
});
 
//多个文件上传
router.post('/multer', upload.array('multerFile'), (req, res) => {    

    if(!req.files){
        return res.send({
            code: -1,
            msg:"检查上传文件提交的数据是否正确",
        });
    }    

    let fileList = [];
    req.files.map((elem) => {
        fileList.push({
            originalname: elem.originalname,
            path: elem.path,
            url: '/uploads/' + elem.filename
        })
    });
    res.json({
        code: "1",
        type: 'multer',
        fileList: fileList
    });
}); 

/**
 * 以下是七牛云 储 接口
 */
const qiniu = require("qiniu");


let accessKey = 'px8UjqJTk-DUKOeDLwwzIZJdwMDJfHw8kSBLFuAn';
let secretKey = 'uhxMXXpXLAAtWiQuvXQV5T27h-sVLOwx_tdAxQXk';
let bucket = 'zjff-learn';		
// ========================================================
//获取七牛云上传凭证接口 GET /upload/qiniuUpToken   用户需要Token验证 
router.get("/qiniuUpToken", (req, res) => {
	//验证用户Token 请求头中携带Token  req.headers.authorization=
	let user = JWT.getUser(req, res);
	if (user == null) return;

	try{		
		let mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
		
		//自定义凭证有效期（示例2小时，expires单位为秒，为上传凭证的有效时间）
		let options = {
		  scope: bucket,
		  expires: 7200,
			// isPrefixalScope:1,//若为 1，表示允许用户上传以 scope 的 keyPrefix 为前缀的文件。
			
			//自定义文件上传到存储之后返回的JSON格式的内容,以便和自己项目的接口返回数据格式一致
			returnBody: `{"code":1,"msg":"获取上传凭证成功","data":{"key":"$(key)","hash":"$(etag)"}}`,
		};
		let putPolicy = new qiniu.rs.PutPolicy(options);
		let uploadToken = putPolicy.uploadToken(mac);	
		console.log(uploadToken);
		res.send({
			code: 1,
			msg: "获取七牛云上传凭证成功！",
			data: uploadToken
		});
	}catch(e){
		res.send({
			code: -1,
			msg: "获取七牛云上传凭证失败！error = " + e.message,
			data: null
		});
	}
});


let privateBucketDomain = 'http://r9v29av8f.bkt.clouddn.com';
// ========================================================
//获取七牛私有云下载地址接口 GET /upload/qiniuPrivateDownloadUrl   用户需要Token验证 
router.get("/qiniuPrivateDownloadUrl", (req, res) => {
	//验证用户Token 请求头中携带Token  req.headers.authorization=
	let user = JWT.getUser(req, res);
	if (user == null) return;
	
	try{
		//获取get请求的数据
		let {key} = req.query;		
		
		let mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
		let config = new qiniu.conf.Config();
		let bucketManager = new qiniu.rs.BucketManager(mac, config);
		
		let deadline = parseInt(Date.now() / 1000) + 3600; // 1小时过期
		let privateDownloadUrl = bucketManager.privateDownloadUrl(privateBucketDomain, key, deadline);
		
		
		console.log(privateDownloadUrl);
		res.send({
			code: 1,
			msg: "获取七牛私有云下载地址成功！",
			data: privateDownloadUrl
		});
	}catch(e){
		res.send({
			code: -1,
			msg: "获取七牛私有云下载地址失败！error = " + e.message,
			data: null
		});
	}
});

module.exports = router;